package supermarketMIS.dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;

import supermarketMIS.bean.Admin;



public class AdminDAO {
	//管理员集合
	ArrayList<Admin> adminList=new ArrayList<>();
	HashSet<Admin> adminSet=new HashSet<>();
	
	//初始数据
	public AdminDAO() {
		// TODO Auto-generated constructor stub
		//读入初始管理员数据
		//读管理员信息文件e:\\data\\admininfo.txt
		//保存管理员集合adminList
		//读文件的时候，一次读一行数据
		adminList=readAdminFile();
		
	}
	/*修改管理员密码功能
	 * （流程： 已知管理员name ，输入原密码，输入新的密码）----UI--
	 * name ,oldPSW,newPSW---service
	 * name ,oldPSW,newPSW---dao
	 * 步骤：
	 * 1-查找管理员文件中，name和oldPSW匹配 
	 * 		1.1将文件的数据读入到集合
	 * 		1.2从集合中查找，如果匹配，执行步骤2；否则执行步骤3
	 * 2.匹配，更新密码
	 * 		2.1集合中删除旧对象
	 * 		2.2封装一个name和newPSW的新对象
	 * 		2.3集合中添加新对象
	 * 		2.4将集合的数据写入到文件
	 * 		2.5更新成功，返回1
	 * 3.不匹配，更新失败，返回0
	 * 
	 * 
	 */
	public int updatePassword(String name,String oldPSW,String newPSW) {
		
		//1.1将文件的数据读入到集合
		adminList=readAdminFile();
		//1.2从集合中查找，
		Admin admin=new Admin(name, oldPSW);
		if(adminList.contains(admin)) {
			//匹配，更新
			//2.1集合中删除旧对象
			adminList.remove(admin);
			//2.2封装一个name和newPSW的新对象
			Admin newAdmin=new Admin(name, newPSW);		
			//2.3集合中添加新对象
			adminList.add(newAdmin);
			//2.4将集合的数据写入到文件
			writeAdminFile(adminList);			
			//2.5更新成功，返回1
			return 1;			
		}
		
		return 0;//更新失败
	}
	private void writeAdminFile(ArrayList<Admin> adminList2) {
		// TODO Auto-generated method stub
		try {
			
			//封装文件对象		
			String path="e:/data/admininfo.txt";//路径
			File file=new File(path);//根据路径封装一个文件对象
			//【3】创建输出流对象，负责向文件写入数据
			FileWriter fw=new FileWriter(file);//覆盖的方式写入数据
			BufferedWriter br=new BufferedWriter(fw);
			//[4]使用流，向文件写入数据
			String data;
			for(Admin admin:adminList2) {
				data=admin.getName()+"###"+admin.getPassword();
				fw.write(data);
				//换行，写入换行符
				fw.write(System.lineSeparator());//等价于br.newLine();				
				//[5]刷新流
				fw.flush();
			}
			
			//【6】关闭流，先调用一次flush刷新，再关闭
			fw.close();
			} catch (Exception e) {
				// TODO: handle exception
			}
		
	}
	private ArrayList<Admin> readAdminFile() {
		// TODO Auto-generated method stub
		//【1】封装文件
		String path="e:/data/admininfo.txt";//路径
		File file=new File(path);//根据路径封装一个文件对象
		//【2】输入流关联文件
		FileReader fReader;
		try {
			fReader = new FileReader(file);
		
		//【3】在输入流的基础上，创建缓冲流
		BufferedReader br=new BufferedReader(fReader);
		//【4】缓冲区，存储读入的一行数据
		String line="";
		while( (line=br.readLine())!=null) {
			//拆分一行数据
			String[] infos=line.split("###");//将一行数据拆分成子串
			//封装一个管理员对象
			Admin admin=new Admin(infos[0], infos[1]);//infos[0]是name，infos[1]是password
			//管理员数据添加到集合
			adminList.add(admin);
		}
		//【5】关闭
		br.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return adminList;
	}
	//查找
	//在管理员集合中查找是否包含给定姓名和密码的管理员对象
	public boolean search(String name,String password) {
		//[1]将输入的姓名和密码封装一个管理员对象
		Admin admin=new Admin(name, password);
		//【2】判断集合中是否包含此对象
		return adminList.contains(admin);
	}
	public int addAdmin(Admin admin) {
		// TODO Auto-generated method stub
		//将管理员数据添加到文件“e:\\data\\admininfo.txt”
		//返回值：如果添加成功，返回1；否则，返回0
		//假设管理员的name是主键，唯一且不重复
		//【1】管理员数据及中是否有这个要添加的name
		for(Admin ad2:adminList) {
			if(ad2.getName().equals(admin.getName())) {
				//已有数据，不会添加
				return 0;
			}
		}		
		//【2】无此name，向数据及添加
		adminList.add(admin);
		//【3】向文件添加
		//[1]数据
		String data=admin.getName()+"###"+admin.getPassword();
		//[2]目的---文件
		try {
		
		//封装文件对象		
		String path="e:/data/admininfo.txt";//路径
		File file=new File(path);//根据路径封装一个文件对象
		//【3】创建输出流对象，负责向文件写入数据
		FileWriter fw=new FileWriter(file,true);//追加的方式写入数据
		//[4]使用流，向文件写入数据
		fw.write(data);
		//换行，写入换行符
		fw.write(System.lineSeparator());//操作系统依赖
		//[5]刷新流
		fw.flush();
		//【6】关闭流，先调用一次flush刷新，再关闭
		fw.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return 1;//添加成功
	}
	

}
